#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' main entry '
__author__ = 'pingwu you'

class Animal():        
    #初始化import加载时，即被执行；类似与static静态初始化
    print("hello a")
    class_var="类变量值啊111111111"
    def __init__(self,name,hello11,hello22) -> None:
        self.name=name
        self._hello11=hello11
        self.__hello22=hello22
    def run(self):
        #LEGB 查找策略 方法参数 实例属性  类属性 模块空间 内置空间
        print("我跑1111:"+self.class_var)
        print("我跑2222:"+self.name)
        print("我跑3333:"+self._hello11)
        print("我跑4444:"+self.__hello22)
        print("我跑5555:"+self.newname)

class Dog(Animal):
    #默认会继承Animal的所有方法属性 包括__init__
    def __init__(self, name) -> None:
        #super().__init__(name, hello11, hello22)
        self.name=name
    def run(self):
        print("Dog 狗8888888888888888888888888------"+self.name)
    #不能重载，因为python完全基于 符号 进行各种处理，符号和指向的对象是完全解耦的
    # 因此同名符号只能唯一指向一个对象，无法通过相关参数进行动态重载定向！！！！！
    #def run(self,tip):
    #    print("可以重载吗？"+tip)

class Cat(object):
    #必须从object顶级基类定义，否则子类无效；不声明好像为None
    __slots__ = ('name', 'say')
    def __init__(self,name) -> None:
        super().__init__()
        self.name=name
    def run(self):
        print("我跑")

class ChinaCat(Cat):
    #只有在父类定义非None情况下，且自己也明确声明非None后才能合并确定属性范围
    #切记包含属性和方法
    __slots__ = ("_birth")
    def run(self):
        print("我跑222222")

    @property
    def birth(self):
        ## 方法名称和实例变量均为birth:
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2015 - self._birth

    def __str__(self):
        return "----------"+self.name+"------"

#链式调用，无属性则进入候补方法进行完善处理
class Chain(object):
    def __init__(self, path=''):
        self._path = path
    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))
    def __str__(self):
        return self._path
    __repr__ = __str__


#callable 对象/函数
class Student(object):
    def __init__(self, name):
        self.name = name
    def __call__(self):
        print('My name is %s.' % self.name)

from enum import Enum, unique

#value属性则是自动赋给成员的int常量，默认从1开始计数。
Wekday=Enum("WD",("MON","WED","SAT","SUN"))

@unique #辅助检测唯一性
class Weekday(Enum):
    Sun = 0 # Sun的value被设定为0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6
